跳到主要内容

数据类型

这些主题包含关于由 GBase 8s ODBC Driver 支持的数据类型的信息。

数据类型

GBase 8s ODBC Driver 支持五种不同的数据类型。

下表描述 GBase 8s ODBC Driver 支持的数据类型。

数据类型描述示例
GBase 8s SQL 数据类型GBase 8s 数据库服务器使用的数据类型CHAR(n)
GBase 8s ODBC Driver SQL 数据类型对应于 GBase 8s SQL 数据类型的数据类型SQL_CHAR
标准 C 数据类型C 编译器定义的数据类型unsigned char
GBase 8s ODBC Driver typedef对应于标准 C 数据类型的 typedefUCHAR
GBase 8s ODBC Driver C 数据类型对应于标准 C 数据类型的数据类型SQL_C_CHAR

SQL 数据类型

GBase 8s 数据库服务器使用 SQL 数据类型。

要获取关于 GBase 8s SQL 数据类型的详尽信息,请参阅《GBase 8s SQL 指南:参考》、《GBase 8s SQL 指南:教程》和 《GBase 8s 用户定义的例程和数据类型开发者指南》。

标准 SQL 数据类型

标准 GBase 8s SQL 数据类型有对应的 GBase 8s ODBC Driver 数据类型。

下表罗列标准 GBase 8s SQL 数据类型及其对应的 GBase 8s ODBC Driver 数据类型。

GBase 8s SQL 数据类型GBase 8s ODBC 驱动程序 SQL 数据类型(fSqlType)描述
BIGINTSQL_INFX_BIGINT精度 10、小数位数 0、取值范围 n 的有符号数值值 (–(263 - 1) ≤ n ≤ 263 – 1)
BIGSERIALSQL_INFX_BIGINT最大为 (263 – 1) 的连续正整数
BOOLEANSQL_BIT't' 或 'f'
BYTESQL_LONGVARBINARY变长的二进制数据
CHAR(n)、CHARACTER(n)SQL_CHAR定长 n (1 ≤ n ≤ 32,767) 的字符串
CHARACTER VARYING(m, r)SQL_VARCHAR变长字符串,最大长度 m (1 ≤ m ≤ 255),最小保留空间量 r (0 ≤ r < m)
DATESQL_DATE日历日期
DATETIMESQL_TIMESTAMP日历日期和当日时刻
DEC(p,s)、DECIMAL(p, s)SQL_DECIMAL带符号的数值值,精度 p,小数位数 s: (1 ≤ p ≤ 32; 0 ≤ sp)
重要:
● 如果使用小数位数值 > 14,则可能导致取整不一致。
● 当 DECIMAL 列包含浮点数据时,GBase 8s ODBC 报告该列的小数位数为 255。这与定点数据不同,其最大小数位数为 32。DataDirect ODBC Driver 始终返回小数位数零。
DOUBLE PRECISIONSQL_DOUBLE带符号的数值值,与标准 C double 数据类型的特征相同
FLOATSQL_DOUBLE带符号数值值,其特征与标准 C double 数据类型相同
IDSSECURITYLABEL内建的 DISTINCT OF VARCHAR(128) 数据类型;仅限于基于标签的访问控制使用。
INT、INTEGERSQL_INTEGER带符号的数值值,精度 10,小数位数 0,取值范围 n (-2,147,483,647 ≤ n ≤ 2,147,483,647)
INT8SQL_BIGINT带符号的数值值,精度 10,小数位数 0,取值范围 n (–(263 - 1) ≤ n ≤ 263 – 1)
INTERVAL MONTH(p)SQL_INTERVAL_MONTH两个日期之间的月数;p 为间隔前导精度。
INTERVAL YEAR(p)SQL_INTERVAL_YEAR两个日期之间的年和月数;p 是间隔前导精度。
INTERVAL YEAR(p) TO MONTHSQL_INTERVAL_YEAR_TO_MONTH两个日期之间的年和月数;p 是间隔前导精度。
INTERVAL DAY(p)SQL_INTERVAL_DAY两个日期之间的天数;p 是间隔前导精度。
INTERVAL HOUR(p)SQL_INTERVAL_HOUR两个日期时刻之间的小时数;p 是间隔前导精度。
INTERVAL MINUTE(p)SQL_INTERVAL_MINUTE两个日期/时刻之间的分钟数;p 是间隔前导精度。
INTERVAL SECOND(p,q)SQL_INTERVAL_SECOND两个日期/时刻之间的秒数;p 是间隔前导精度,q 是间隔第二精度。
INTERVAL DAY(p) TO HOURSQL_INTERVAL_DAY_TO_HOUR两个日期/时刻之间的天/小时数;p 是间隔前导精度。
INTERVAL DAY(p) TO MINUTESQL_INTERVAL_DAY_TO_MINUTE两个日期/时刻之间的天/小时/分钟数;p 是间隔前导精度。
INTERVAL DAY(p) TO SECOND(q)SQL_INTERVAL_DAY_TO_SECOND两个日期/时刻之间的天/小时/分钟/秒数;p 是间隔前导精度,q 是间隔第二精度。
INTERVAL HOUR (p) TO MINUTESQL_INTERVAL_HOUR_TO_MINUTE两个日期/时刻之间的小时/分钟数;p 是间隔前导精度。
INTERVAL HOUR(p) TO SECOND(q)SQL_INTERVAL_HOUR_TO_SECOND两个日期/时刻之间的小时/分钟/秒数;p是间隔前导精度,q 是间隔第二精度。
INTERVAL MINUTE(p) TO SECOND(q)SQL_INTERVAL_MINUTE_TO_SECOND两个日期/时刻之间的分钟/秒数;p 是间隔前导精度,q 是间隔第二精度。
LVARCHARSQL_VARCHAR变长字符串,长度为 l (255 ≤ l ≤ 32,000)
MONEY(p, s)SQL_DECIMAL带符号的数值值,精度 p,小数位数 s (1 ≤ p ≤ 32; 0 ≤ sp)
NUMERICSQL_NUMERIC带符号的精确数值值,精度 p,小数位数 s (1 ≤ p ≤ 15; 0 ≤ sp)
REALSQL_REAL带符号的数值值,与标准 C float 数据类型有相同的特征
SERIALSQL_INTEGER连续的 INTEGER
SERIAL8SQL_BIGINT连续的 INT8
SMALLFLOATSQL_REAL带符号的数值值,与标准 C float 数据类型有相同的特征
SMALLINTSQL_SMALLINT带符号的数值值,精度 5,小数位数 0,取值范围 n (–32,767 ≤ n ≤ 32,767)
TEXTSQL_LONGVARCHAR变长字符串
VARCHAR(m, r)SQL_VARCHAR变长字符串,最大长度 m (1 ≤ m ≤ 255),最小保留空间量 r (0 ≤ r < m)
Visual Basic 客户机侧游标

当您使用 Visual Basic 客户机侧游标来执行与使用 CHAR 或 LVARCHAR 列有关的 rowset 更新操作时,若这些列长度大于或等于 16,385,GBase 8s ODBC Driver 可能返回错误。

当长度大于或等于 16,385 时,Visual Basic 将该 SQL 数据类型发送至 SQLBindParameter,作为 SQL_LONGVARCHAR 而不是 SQL_VARCHAR。GBase 8s ODBC Driver 将 SQL_LONGVARCHAR 映射为 TEXT 数据类型。因此,应用程序可能看到错误:

[GBase 8s][GBase 8s ODBC Driver]No cast from text to lvarchar

[GBase 8s][GBase 8s ODBC Driver]Illegal attempt to use Text/Byte host variable.

GLS 的附加 SQL 数据类型

GLS 的附加 SQL 数据类型有对应的 GBase 8s ODBC Driver 数据类型。

下表罗列 GLS 的附加 GBase 8s SQL 数据类型,及其对应的 GBase 8s ODBC Driver 数据类型。GBase 8s ODBC 驱动程序不提供完全的 GLS 支持。要获取关于 GLS 的更多信息,请参阅《GBase 8s GLS 用户指南》。

GBase 8s SQL 数据类型GBase 8s ODBC 驱动程序 SQL 数据类型(fSqlType)描述
NCHAR(n)SQL_CHAR定长 n 的字符串(1 ≤ n ≤ 32,767)。排序方式依赖于语言环境。
NVARCHAR(m, r)SQL_VARCHAR变长字符串,最大长度 m(1 ≤ m ≤ 255),最小保留空间量 r(0 ≤ r < m)。排序方式依赖于语言环境。

GBase 8s 的附加 SQL 数据类型

GBase 8s 的附加 GBase 8s SQL 数据类型有对应的 GBase 8s ODBC Driver 数据类型。

下表罗列 GBase 8s 的附加 GBase 8s SQL 数据类型,及其对应的 GBase 8s ODBC Driver 数据类型。要使用 GBase 8s 的 GBase 8s ODBC 驱动程序 SQL 数据类型,请包括 infxcli.h。

GBase 8s SQL 数据类型GBase 8s ODBC 驱动程序 SQL 数据类型(fSqlType)描述
集合(LIST、MULTISET、SET)任何 GBase 8s ODBC 驱动程序 SQL 数据类型由一个或多个元素组成的合成的值,在此,每一元素都有相同的数据类型。
DISTINCT任何 GBase 8s ODBC 驱动程序 SQL 数据类型存储方式与其源数据类型相同的 UDT,但有不同的强制转型和函数
OPAQUE(固定的)SQL_INFX_UDT_FIXED带有内部结构的定长 UDT,对于所有可能的值都有相同大小
OPAQUE(变化的)SQL_INFX_UDT_VARYING带有内部结构的变长 UDT,对于每一不同的值,可有不同的大小
row(命名的行、未命名的行)任何 GBase 8s ODBC Driver SQL 数据类型由一个或多个元素组成的合成的值,在此,每一元素可有不同的数据类型。
智能大对象(BLOB 或 CLOB)SQL_IFMX_UDT_BLOB SQL_IFMX_UDT_CLOB存储在磁盘上 sbspace 中的大对象,且是可恢复的。

精度、小数位数、长度和显示大小

为 SQL 值取得和设置精度、小数位数、长度和显示大小的函数对其输入参数有大小限制。

因此,这些值限定为 SDWORD 的大小,其最大值为 2,147,483,647。下表描述这些值。

数值数据类型的描述非数值数据类型的描述
精度最大的数字个数。或为最大长度,或为指定的长度。
小数位数小数点之后数字的最大个数。对于浮点值,未定义小数位数,因为其小数点右边的数字个数不固定。不适用。
长度当将一个值转换为为其缺省的 C 数据类型时,函数返回的最大字节数。当将一个值转换为为其缺省的 C 数据类型时,函数返回的最大字节数。该长度不包括 NULL 终止字节。
显示大小需要以字符形式显示数据的最大字节数。需要以字符形式显示数据的最大字节数。
标准 SQL 数据类型

对于标准 GBase 8s ODBC Driver SQL 数据类型,查看精度、小数位数、长度和显示大小的值。

下表描述标准 GBase 8s ODBC Driver SQL 数据类型的精度、小数位数、长度和显示大小。

GBase 8s ODBC 驱动程序 sql 数据类型(fSqlType)描述
SQL_BIGINT精度
19。对于此数据类型,SQLBindParameter 忽略 cbColDef 的值。
小数位数
0。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
8 字节
显示大小
20 位。一位表示符号。
SQL_BIT精度
1。对于此数据类型,SQLBindParameter 忽略 cbColDef 的值。
小数位数
0。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
1 字节
显示大小
1 位
SQL_CHAR精度
与长度相同
小数位数
不适用。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
指定的长度。例如,CHAR(10) 的长度为 10 字节。
显示大小
与长度相同。
SQL_DATE精度
10。对于此数据类型,SQLBindParameter 忽略 cbColDef 的值。
小数位数
不适用。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
6 字节
显示大小
10 位,格式为 yyyy-mm-dd。
SQL_DECIMAL精度
指定的精度。例如,DECIMAL(12, 3) 的精度是 12。
小数位数
指定的小数位数。例如,DECIMAL(12, 3) 的小数位数是 3。
长度
指定的精度加 2。例如,DECIMAL(12, 3) 的长度是 14 字节。两个额外的字节用于符号和小数点,因为函数作为字符串返回此数据类型。
显示大小
与长度相同。
SQL_DOUBLE精度
15。对于此数据类型,SQLBindParameter 忽略 cbColDef 的值。
小数位数
不适用。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
8 字节
显示大小
22 位。这些位代表一个符号、15 个数值字符、一个小数点、字母 E,另一符号,以及另外两个数值字符。
SQL_INTEGER精度
10。对于此数据类型,SQLBindParameter 忽略 cbColDef 的值。
小数位数
0。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
4 字节
显示大小
11 位。一位代表符号。
SQL_LONGVARBINARY精度
与长度相同。
小数位数
不适用。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
最大长度。如果函数无法确定最大长度,则它返回 SQL_NO_TOTAL。
显示大小
最大长度的 2 倍。如果函数无法确定最大长度,则它返回 SQL_NO_TOTAL。
SQL_LONGVARCHAR精度
与长度相同。
小数位数
不适用。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
最大长度。如果函数无法确定最大长度,则它返回 SQL_NO_TOTAL。
显示大小
与长度相同。
SQL_REAL精度
7。对于此数据类型,SQLBindParameter 忽略 cbColDef 的值。
小数位数
不适用。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
4 字节
显示大小
13 位。这些位表示一个符号、7 个数值字符、一个小数点、字母 E、另一个符号和另外 2 个数值字符。
SQL_SMALLINT精度
5。对于此数据类型,SQLBindParameter 忽略 cbColDef 的值。
小数位数
0。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
2 字节
显示大小
6 位。一位表示符号。
SQL_TIMESTAMP精度
8。对于此数据类型,SQLBindParameter 忽略 cbColDef 的值。
小数位数
FRACTION 域中的位数。 长度 16 字节 显示大小 19 位或更多:
● 如果时间戳的小数位数为 0: 19 位,格式为 yyyy-mm-dd hh:mm:ss。
● 如果时间戳的小数位数超出 0: 20 位加上 FRACTION 域中的数字,格式为 yyyy-mm-dd hh:mm:ss.f...
SQL_VARCHAR精度
与长度相同。
小数位数
不适用。对于此数据类型,SQLBindParameter 忽略 ibScale 的值。
长度
指定的长度。例如,VARCHAR(10) 的长度是 10 字节。 显示大小 与长度相同。
GBase 8s 的附加 SQL 数据类型

对于 GBase 8s ODBC Driver SQL 数据类型,查看精度、小数位数、长度和显示大小的值。

对于 GBase 8s ,下表描述 GBase 8s ODBC Driver SQL 数据类型的精度、小数位数、长度和显示大小。

GBase 8s ODBC 驱动程序 sql 数据类型(fSqlType)描述
SQL_IFMX_UDT_BLOB精度
变量值。要确定此值,请调用返回列的精度的函数。
小数位数
不适用。对于此数据类型,返回列的小数位数的函数返回 -1。
长度
变量值。要确定此值,请调用返回列的长度的函数。
显示大小
变量值。要确定此值,请调用返回列的显示大小的函数。
SQL_IFMX_UDT_CLOB精度
变量值。要确定此值,请调用返回列的精度的函数。
小数位数
不适用。对于此数据类型,返回列的小数位数的函数返回 -1。
长度
变量值。要确定此值,请调用返回列的长度的函数。
显示大小
变量值。要确定此值,请调用返回列的显示大小的函数。
SQL_INFX_UDT_FIXED精度
变量值。要确定此值,请调用返回列的精度的函数。
小数位数
不适用。对于此数据类型,返回列的小数位数的函数返回 -1。
长度
变量值。要确定此值,请调用返回列的长度的函数。
显示大小
变量值。要确定此值,请调用返回列的显示大小的函数。
SQL_INFX_UDT_VARYING精度
变量值。要确定此值,请调用返回列的精度的函数。
小数位数
不适用。对于此数据类型,返回列的小数位数的函数返回 -1。
长度
变量值。要确定此值,请调用返回列的长度的函数。
显示大小
变量值。要确定此值,请调用返回列的显示大小的函数。

C 数据类型

GBase 8s ODBC Driver 应用程序使用 C 数据类型来存储该应用程序处理的值。

下表描述 GBase 8s ODBC Driver 提供的 C 数据类型。

重要: GBase 8s ODBC 驱动程序函数中的字符串参数是无符号的。因此,在使用它作为 GBase 8s ODBC 驱动程序函数中的参数之前,需要强制转型 CString 对象为无符号字符串。

GBase 8s ODBC 驱动程序 C 数据类型(fCType)GBase 8s ODBC 驱动程序 typedef标准 C 数据类型
二进制SQL_C_BINARYUCHAR FAR *unsigned char FAR *
布尔SQL_C_BITUCHARunsigned char
字符SQL_C_CHARUCHAR FAR *unsigned char FAR *
宽字符SQL_C_WCHARWCHAR FAR *wchar_t FAR *
日期SQL_C_DATEDATE_STRUCTstruct tagDATE_STRUCT{ SWORD year; UWORD month; UWORD day; }
间隔SQL_C_INTERVAL_YEARSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_MONTHSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_DAYSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_HOURSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_MINUTESQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_SECONDSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_YEAR _TO_MONTHSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_DAY _TO_HOURSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_DAY_ TO_MINUTESQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_DAY_ TO_SECONDSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_HOUR _TO_MINUTESQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_HOUR _TO_SECONDSQL_INTERVAL_STRUCTC 间隔结构
SQL_C_INTERVAL_MINUTE _TO_SECONDSQL_INTERVAL_STRUCTC 间隔结构
数值SQL_C_DOUBLESDOUBLEsigned double
SQL_C_FLOATSFLOATsigned float
SQL_C_LONGSDWORDsigned long int
SQL_C_NUMERICSQL_NUMERIC_STRUCTstruct tag SQL_NUMERIC_STRUCT { SQLCHAR precision; SQLSCHAR scale; SQLCHAR sign; SQLCHAR val [SQL_MAX_NUMERIC_LEN]; }SQL_NUMERIC_STRUCT;
SQL_C_SHORTSWORDsigned short int
SQL_C_SLONGSDWORDsigned long int
SQL_C_SSHORTSWORDsigned short int
SQL_C_STINYINTSCHARsigned char
SQL_C_TINYINTSCHARsigned char
SQL_C_ULONGUDWORDunsigned long int
SQL_C_USHORTUWORDunsigned short int
SQL_C_UTINYINTUCHARunsigned char
时间戳SQL_C_TIMESTAMPTIMESTAMP_STRUCTstruct tagTIMESTAMP_STRUCT { SWORD year; UWORD month; UWORD day; UWORD hour; UWORD minute;UWORD second; UDWORD fraction; }

C 间隔结构

通过使用 C 间隔结构,来为 SQL 间隔数据类型指定 C 数据类型。

下列结构为 SQL 间隔数据类型指定 C 数据类型:

typedef struct tagSQL_INTERVAL_STRUCT
{
SQLINTERVAL interval_type;
SQLSMALLINT interval_sign;
union
{
SQL_YEAR_MONTH_STRUCT year_month;
SQL_DAY_SECOND_STRUCT day_second;
} intval;
}SQLINTERVAL_STRUCT;

typedef enum
{
SQL_IS_YEAR=1,
SQL_IS_MONTH=2,
SQL_IS_DAY=3,
SQL_IS_HOUR=4,
SQL_IS_MINUTE=5,
SQL_IS_SECOND=6,
SQL_IS_YEAR_TO_MONTH=7,
SQL_IS_DAY_TO_HOUR=8,
SQL_IS_DAY_TO_MINUTE=9,
SQL_IS_DAY_TO_SECOND=10,
SQL_IS_HOUR_TO_MINUTE=11,
SQL_IS_HOUR_TO_SECOND=12,
SQL_IS_MINUTE_TO_SECOND=13,
}SQLINTERVAL;

typedef struct tagSQL_YEAR_MONTH
{
SQLUINTEGER year;
SQLUINTEGER month;
}SQL_YEAR_MOHTH_STRUCT;

typedef struct tagSQL_DAY_SECOND
{
SQLUINTEGER day;
SQLUNINTEGER hour;
SQLUINTEGER minute;
SQLUINTEGER second

传输数据

在使用同一 DBMS 的数据源之中,可以安全地以 DBMS 使用的内部形式传输数据。

对于特定的数据,源数据源和目标数据源中的SQL 数据类型必须相同。C 数据类型为 SQL_C_BINARY

当调用 SQLFetch、SQLExtendedFetch 或 SQLGetData 来从数据源检索此数据时,GBase 8s ODBC Driver 检索该数据,并不经转换,将它传输至 SQL_C_BINARY类型 的存储位置。当调用 SQLExecute、SQLExecDirect 或 SQLPutData 来将此数据发送至目标数据源时,GBase 8s ODBC Driver 从该存储位置检索数据,不经转换,将它传输至目标数据源。

INT8、SERIAL8 和 BIGSERIAL 数据类型的二进制表示是两个无符号长整型数组,后跟一个指示符号的短整数。符号字段为 1 表示正值,-1 表示负值,0 表示空值。

重要: 在 DMBS 之中,以此方式传输任何数据(二进制数据除外)的应用程序不可互操作。

报告标准 ODBC 类型

GBase 8s ODBC Driver 仅支持支持标准 ODBC 数据类型的现有应用程序。请勾选 DSN 选项报告标准 ODBC 类型,来开启此行为。

当应用程序设置此选项时,驱动程序设置下列行为:

  • 对于定义了新数据类型的所有驱动程序,仅报告标准 ODBC 数据类型。
  • 对于智能大对象(LO),可访问数据类型访问方法为 SQL_LONGVARCHAR 和 SQL_LONGVARBINARY。换句话说,SQL_LONGVARCHAR 和 SQL_LONGVARBINARY 行为就像简单大对象、byte 和 text 一样。
  • 将 defaultUDTfetchtype 设置为 SQL_C_CHAR

然而,可分别控制上述每一活动作为一个连接或语句级选项。请使用下列连接和语句级属性:

  • SQL_INFX_ATTR_ODBC_TYPES_ONLY
  • SQL_INFX_ATTR_LO_AUTOMATIC
  • SQL_INFX_ATTR_DEFAULT_UDT_FETCH_TYPE

应用程序可使用 SQLSetConnectAttr 和 SQLSetStmtAttr 来设置和复位这些值。(ODBC 2.x 应用程序可等同地使用 SQLSetConnectOption 与 SQLSetStmtOption。)

SQL_INFX_ATTR_ODBC_TYPES_ONLY

应用程序可将 SQL_INFX_ATTR_ODBC_TYPES_ONLY 属性设置为值 SQL_TRUE 或 SQL_FALSE。

可在连接级和语句级设置和复位此属性。在同一连接之下分配的所有语句都继承此值。或者,每一语句可更改此属性。在缺省情况下,设置此属性为 SQL_FALSE。

通过使用 SQLSetConnectAttr 和 SQLSetStmtAttr(ODBC 2.x 中的 SQLSetConnectOption 和 SQLSetStmtOption),应用程序可更改此属性的值。通过使用 SQLGetConnectAttr 和 SQLGetStmtAttr(ODBC 2.x 中的 SQLGetConnectOption 和 SQLGetStmtOption),应用程序可检索这些值。

当将 SQL_INFX_ATTR_LO_AUTOMATIC 设置为 SQL_FALSE 时,不可将此属性设置为 SQL_TRUE。返回报告下列消息的错误消息:

Attribute cannot be set. LoAutomatic should be ON to set this value.

应用程序应先将 SQL_INFX_ATTR_LO_AUTOMATIC 属性设置为 SQL_TRUE,然后,将 SQL_INFX_ATTR_ODBC_TYPES_ONLY 属性设置为 SQL_TRUE。

SQL_INFX_ATTR_LO_AUTOMATIC

应用程序可将 SQL_INFX_ATTR_LO_AUTOMATIC 属性设置为值 SQL_TRUE 或 SQL_FALSE。

可在连接级和语句级设置和复位此属性。在同一连接之下分配的所有语句都继承此值。或者,每一语句都可更改此属性。缺省情况下,设置此属性为 SQL_FALSE。

通过使用 SQLSetConnectAttr 和 SQLSetStmtAttr(ODBC 2.x 中的 SQLSetConnectOption 和 SQLSetStmtOption),应用程序可更改此属性的值。通过使用 SQLGetConnectAttr 和 SQLGetStmtAttr(ODBC 2.x 中的 SQLGetConnectOption 和 SQLGetStmtOption),应用程序可检索这些值。

当将 SQL_INFX_ATTR_ODBC_TYPES_ONLY 设置为 SQL_TRUE 时,不可将属性 SQL_INFX_ATTR_LO_AUTOMATIC 设置为 SQL_FALSE。返回报告下列消息的错误消息:

Attribute cannot be set. ODBC types only should be OFF to set this value.

应用程序应先将属性 SQL_INFX_ODBC_TYPES_ONLY 设置为 SQL_FALSE,然后将属性 SQL_INFX_ATTR_LO_AUTOMATIC 设置为 SQL_FALSE。

SQL_INFX_ATTR_DEFAULT_UDT_FETCH_TYPE

应用程序可将 SQL_INFX_ATTR_DEFAULT_UDT_FETCH_TYPE 属性设置为 SQL_C_CHARSQL_C_BINARY,来设置 UDT 的缺省访存类型。

依赖于下列条件,设置此属性的缺省值:

  • 如果报告标准 ODBC 类型的 DSN 设置为 ON,则将 DefaultUDTFetchType 的值设置为 SQL_C_CHAR
  • 如果报告标准 ODBC 类型的 DSN 设置为 OFF,则将 DefaultUDTFetchType 的值设置为 SQL_C_BINARY
  • 如果用户已设置了注册表键,只要未设置报告标准 ODBC 类型,则将 DefaultUDTFetchType 的值设置为注册表中的值。

通过使用 SQLSetConnectAttr 和 SQLSetStmtAttr(ODBC 2.x 中的 SQLSetConnectOption 和 SQLSetStmtOption),应用程序可更改此属性的值。通过使用 SQLGetConnectAttr 和 SQLGetStmtAttr(ODBC 2.x 中的 SQLGetConnectOption 和 SQLGetStmtOption),应用程序可检索这些值。

将报告标准 ODBC 类型设置为 ON,会始终将 DefaultUDTFetchType 重写为 SQL_C_CHAR

报告宽字符列

GBase 8s 服务器不支持宽字符数据类型。

当应用程序设置 Report Char Columns as Wide Char Columns 选项时,驱动程序设置下列行为:

  • SQLDescribeCol 报告 char 列为宽 char 列
  • 报告 SQL_CHAR 列为 SQL_WCHAR
  • 报告 SQL_VARCHAR 列为 SQL_WVARCHAR
  • 报告 SQL_LONGVARCHAR 列为 SQL_WLONGVARCHAR
  • 缺省值为:0(禁用的)

设置 Report Char Columns as Wide Char Columns 选项之后,请以有下列行为的 SQL 数据类型来调用 SQLBindParameter:

  • 将 SQL_WCHAR 映射至 SQL_CHAR
  • 将 SQL_WVARCHAR 映射至 SQL_VARCHAR
  • 将 SQL_WLONGVARCHAR 映射至 SQL_LONGVARCHAR

报告标准 ODBC 数据类型的 DSN 设置

对于 UNIX™ 和 Windows™,可添加新的 DSN 选项 NeedODBCTypesOnly。

对于 UNIX,在 odbc.ini 文件中的 DSN 设置之下,添加新的 DSN 选项 NeedODBCTypesOnly:

[GBase 8s]
Driver=/gbasedbt/lib/cli/libthcli.so
Description=GBase 8s ODBC Driver
….
NeedODBCTypesOnly=1

对于 Windows,对于 GBase 8s Driver DSN [缺省值为 0],请检查 ODBC Administration 的 Advanced 标签之下的此选项。

下表展示如何将 GBase 8s 数据类型映射至标准 ODBC 数据类型。

表 1. GBase 8s 和 ODBC 数据类型映射

GBase 8sODBC
BigintSQL_BIGINT
BigserialSQL_BIGINT
BlobSQL_LONGVARBINARY
BooleanSQL_BIT
ClobSQL_LONGVARCHAR
Int8SQL_BIGINT
LvarcharSQL_VARCHAR
Serial8SQL_BIGINT
MultisetSQL_C_CHAR or SQL_C_BINARY
SetSQL_C_CHAR or SQL_C_BINARY
ListSQL_C_CHAR or SQL_C_BINARY
RowSQL_C_CHAR or SQL_C_BINARY
重要
  • 对于 multiset、set、row 和 list 数据类型,将该数据类型映射至 defaultUDTFetchType 属性集(SQL_C_CHARSQL_C_BINARY)。
  • 要使得 SQL_BIGINT 能够与 SQLBindCol 和 SQLBindParameter 正确工作,您必须使用 SQL_C_UBIGINT(其有 8 字节无符号整数的支持数据范围),而不使用 SQL_C_LONG(其有 4 字节整数的支持数据范围)。

转换数据

在本部分中使用的词语转换是广义的;它包括不经数据类型转换,将数据从一个存储位置转移至另一个。

标准转换

标准转换存在于 GBase 8s SQL 数据类型与 GBase 8s ODBC Driver C 数据类型之间。

仅 GBase 8s 可将数据转换为 SQL_C_BIT

GBase 8s ODBC 驱动程序 C 数据类型 SQL_C_BINARYSQL_C_CHARSQL_C_WCHAR 支持罗列在下表中的所有 GBase 8s SQL 数据类型之间转换。

下表展示在 GBase 8s SQL 数据类型与 GBase 8s ODBC Driver C 数据类型之间支持的转换。

表 1. 在 GBase 8s SQL 数据类型与 ODBC Driver C 数据类型之间支持的转换.

展示在 GBase 8s SQL 数据类型与 ODBC Driver C 数据类型之间支持的转换的五列表。

SQL 数据类型 ODBC 驱动程序 C 数据类型(目标类型)
SQL_C_BIT SQL_C_DATE SQL_C_DOUBLE SQL_C_FLOAT
BOOLEAN
CHAR、CHARACTER
CHARACTER VARYING
DATE
DATETIME
DEC、DECIMAL
DOUBLE PRECISION
FLOAT
INT、INTEGER
LVARCHAR
MONEY
NUMERIC
REAL
SERIAL
SMALLFLOAT
SMALLINT
TEXT
VARCHAR

表 2. 在 GBase 8s SQL 数据类型与 ODBC Driver C 数据类型之间支持的转换.

展示在 GBase 8s SQL 数据类型与 ODBC Driver C 数据类型之间支持的转换的五列表。

SQL 数据类型 ODBC 驱动程序 C 数据类型(目标类型)
SQL_C_LONG SQL_C_NUMERIC SQL_C_SHORT SQL_C_SLONG
BIGINT
BIGSERIAL
BYTE
CHAR、CHARACTER
CHARACTER VARYING
DEC、DECIMAL
DOUBLE PRECISION
FLOAT
INT、INTEGER
INT8
LVARCHAR
MONEY
NUMERIC
REAL
SERIAL
SERIAL8
SMALLFLOAT
SMALLINT
TEXT
VARCHAR

表 3. 在 GBase 8s SQL 数据类型与 ODBC Driver C 数据类型之间支持的转换.

展示在 GBase 8s SQL 数据类型 与 ODBC Driver C 数据类型支持的展缓的五列表。

SQL 数据类型 ODBC 驱动程序 C 数据类型(目标类型)
SQL_C_SSHORT SQL_C_STINYINT SQL_C_TIMESTAMP
BIGINT
BIGSERIAL
CHAR、CHARACTER
CHARACTER VARYING
DATE
DATETIME
DEC、DECIMAL
DOUBLE PRECISION
FLOAT
INT、INTEGER
INT8
LVARCHAR
MONEY
NUMERIC
REAL
SERIAL
SERIAL8
SMALLFLOAT
SMALLINT
TEXT
VARCHAR

ODBC 驱动程序 C 数据类型 SQL_C_ULONG 支持罗列在下表中的所有 SQL 数据类型之间的转换。

表 4. 在 GBase 8s SQL 数据类型与 ODBC Driver C 数据类型之间支持的转换.

展示在 GBase 8s SQL 数据类型与 ODBC Driver C 数据类型之间支持的转换的五列表。

SQL 数据类型 ODBC 驱动程序 C 数据类型(目标类型)
SQL_C_TINYINT SQL_C_USHORT SQL_C_UTINYINT
BIGINT
BIGSERIAL
CHAR、CHARACTER
CHARACTER VARYING
DEC、DECIMAL
DOUBLE PRECISION
FLOAT
INT、INTEGER
INT8
LVARCHAR
MONEY
NUMERIC
REAL
SERIAL
SERIAL8
SMALLFLOAT
SMALLINT
VARCHAR

GLS 的附加转换

在 GLS 的 GBase 8s SQL 数据类型与 GBase 8s ODBC Driver C 数据类型之间有支持的转换。

仅 GBase 8s 可将数据转换为 SQL_C_BIT

GBase 8s NCHAR 和 NVARCHAR SQL 数据类型支持在下列 ODBC 驱动程序 C 数据类型(fCType)之间转换:

  • SQL_C_BINARY
  • SQL_C_BIT
  • SQL_C_CHAR
  • SQL_C_DATE
  • SQL_C_DOUBLE
  • SQL_C_FLOAT
  • SQL_C_LONG
  • SQL_C_SHORT
  • SQL_C_SLONG
  • SQL_C_SSHORT
  • SQL_C_STINYINT
  • SQL_C_TIME STAMP
  • SQL_C_TINYINT
  • SQL_C_ULONG
  • SQL_C_USHORT
  • SQL_C_UTINYINT

GBase 8s 的附加转换

在 GBase 8s 的附加 GBase 8s SQL 数据类型与 GBase 8s ODBC Driver C 数据类型之间有支持的转换。

GBase 8s SQL 数据类型 Collection、DISTINCT、Row 和智能大对象支持在下列 GBase 8s ODBC 驱动程序 C 数据类型(fCType)之间转换:

  • SQL_C_BINARY
  • SQL_C_BIT
  • SQL_C_CHAR
  • SQL_C_DATE
  • SQL_C_DOUBLE
  • SQL_C_FLOAT
  • SQL_C_LONG
  • SQL_C_SHORT
  • SQL_C_SLONG
  • SQL_C_SSHORT
  • SQL_C_STINYINT
  • SQL_C_TIMESTAMP
  • SQL_C_TINYINT
  • SQL_C_ULONG
  • SQL_C_USHORT
  • SQL_C_UTINYINT

GBase 8s SQL 数据类型 OPAQUE 支持在 SQL_C_BINARYSQL_C_CHAR ODBC 驱动程序 C 数据类型(fCType)之间转换。请使用 SQL_C_CHAR 作为字符串来访问外部格式的 OPAQUE 值。请使用 SQL_C_BINARY 来访问内部二进制格式的 OPAQUE。

将数据由 SQL 转换为 C

当调用 SQLExtendedFetch、SQLFetch 或 SQLGetData 时,GBase 8s ODBC Driver 从数据源检索数据。

如有必要,GBase 8s ODBC Driver 将数据由源数据类型转换为 SQLBindCol 中 TargetType 参数或 SQLGetData 中 fCType 参数指定的数据类型。最终,GBase 8s ODBC Driver 将该数据存储在由 SQLBindCol 或 SQLGetData 中 rgbValue 参数指向的位置中。

下面部分中的表描述 GBase 8s ODBC Driver如何从数据源检索的数据转换它。对于给定的 GBase 8s ODBC Driver SQL 数据类型,表的第一列罗列 SQLBindCol 中 TargetType 参数和 SQLGetData 中 fCType 参数的合法输入值。第二列罗列测试的结果,通常通过使用 SQLBindCol 或 SQLGetData 中 cbValueMax参数,GBase 8s ODBC Driver执行其来确定它是否可转换该数据。对于每一结果,第三和第四列罗列在 GBase 8s ODBC Driver 试图转换该数据之后,在 SQLBindCol 或 SQLGetData 中指定的 rgbValuepcbValue 参数的值。

对于每一结果,最后一列罗列由 SQLExtendedFetch、SQLFetch 或 SQLGetData 返回的 SQLSTATE。

如果 SQLBindCol 中的 TargetType 参数或 SQLGetData 中的 fCType 参数包含一个 GBase 8s ODBC Driver C 数据类型的值,而该数据类型未显示在给定的 GBase 8s ODBC Driver SQL 数据类型的表中,则 SQLExtendedFetch、SQLFetch 或 SQLGetData 返回 SQLSTATE 07006(受限制的数据类型属性违反)。如果 fCType 参数或 TargetType 参数包含一值,其指定由特定于驱动程序的 SQL 数据类型转换为 GBase 8s ODBC Driver C 数据类型,且 GBase 8s ODBC Driver 不支持此转换,则 SQLExtendedFetch、SQLFetch 或 SQLGetData 返回 SQLSTATE S1C00(驱动程序不支持)。

虽然本章节中的表未展示它,但当 SQL 数据值为空时,pcbValue 参数包含 SQLNULL_DATA。当 GBase 8s ODBC Driver 将 SQL 数据转换为字符 C 数据时,_pcbValue 中返回的字符计数不包括空终止字节。如果 rgbValue 是空指针,则 SQLBindCol 或 SQLGetData 返回 SQLSTATE S1009(无效的参数值)。

表中使用下列术语和惯例:

数据的长度

无论数据在返回到应用程序之前是否被截断,都可以在 rgbValue 中返回的 C 数据的字节数。对于字符串数据,这不包括空终止字节。

显示大小

以字符格式显示该数据所需要的总字节数。

斜体词语

表示函数参数或 GBase 8s ODBC Driver SQL 语法的元素。

缺省的 C 数据类型

可为不同的函数指定 SQL_C_DEFAULT,以便于 GBase 8s ODBC Driver 使用该 C 数据类型。

如果为 SQLBindCol 中的 TargetType 参数、SQLGetData 中的 fCType 参数或 SQLBindParameter 中的 ValueType 参数指定 SQL_C_DEFAULT,则 GBase 8s ODBC Driver使用输出或输入缓冲区的 C 数据类型作为缓冲区绑定的列或参数的 SQL 数据类型

标准缺省 C 数据类型

对于每一 GBase 8s ODBC Driver SQL 数据类型,有缺省的 C 数据类型。

对于每一 GBase 8s ODBC Driver SQL 数据类型,下表展示缺省 C 数据类型。

GBase 8s ODBC 驱动程序 SQL 数据类型(fSqlType)缺省的 GBase 8s ODBC 驱动程序 C 数据类型(fCType)
SQL_BIGINTSQL_C_CHAR
SQL_BITSQL_C_BITS
SQL_CHARSQL_C_CHAR
SQL_DATESQL_C_DATE
SQL_DECIMALSQL_C_CHAR
SQL_DOUBLESQL_C_DOUBLE
SQL_INTEGERSQL_C_SLONG
SQL_LONGVARBINARYSQL_C_BINARY
SQL_LONGVARCHARSQL_C_CHAR
SQL_NUMERICSQL_C_NUMERIC
SQL_REALSQL_C_FLOAT
SQL_SMALLINTSQL_C_SSHORT
SQL_TIMESTAMPSQL_C_TIMESTAMP
SQL_VARCHARSQL_C_CHARS

GBase 8s 的附加缺省 C 数据类型

对于每一附加的 GBase 8s ODBC Driver SQL 数据类型,有缺省 C 数据类型。

对于 GBase 8s 的每一附加的 GBase 8s ODBC Driver SQL 数据类型,下表展示缺省的 C 数据类型。

GBase 8s ODBC 驱动程序 SQL 数据类型(fSqlType)缺省的 GBase 8s ODBC 驱动程序 C 数据类型(fCType)
SQL_IFMX_UDT_BLOBSQL_C_BINARY
SQL_IFMX_UDT_CLOBSQL_C_BINARY
SQL_INFX_UDT_FIXED此 GBase 8s ODBC Driver SQL 数据类型没有缺省的 GBase 8s ODBC Driver C 数据类型。由于此 GBase 8s ODBC 驱动程序 SQL 数据类型可包含二进制数据或字符数据,因此,在访存对应的值之前,您必须为此 GBase 8s ODBC 驱动程序 SQL 数据类型绑定一个变量。绑定的变量的数据类型为该值指定 C 数据类型。
SQL_INFX_UDT_VARYING此 GBase 8s ODBC Driver SQL 数据类型没有缺省的 GBase 8s ODBC Driver C 数据类型。因为此 GBase 8s ODBC Driver SQL 数据类型包含二进制数据或字符数据,因此在访存对应的值之前,您必须为此 GBase 8s ODBC Driver SQL 数据类型绑定一个变量。绑定的变量的数据类型为该值指定 C 数据类型。
SQL 至 C:二进制

二进制 GBase 8s ODBC Driver SQL 数据类型是 SQL_LONGVARBINARY。

下表展示可将二进制 SQL 数据转换成的 GBase 8s ODBC Driver C 数据类型。

fCType 测试 rgbValue pcbValue SQLSTATE
SQL_C_BINARY 数据的长度 ≤ cbValueMax 数据 数据的长度 不适用
数据的长度 > cbValueMax 截断的数据 数据的长度 01004
SQL_C_CHAR (数据的长度) * 2 < cbValueMax 数据 数据的长度 不适用
(数据的长度) * 2 ≥ cbValueMax 截断的数据 数据的长度 01004

当 GBase 8s ODBC Driver 将二进制 SQL 数据转换为字符 C 数据时,将源数据的每一字节(8 位)表示为两个 ASCII 字符。这些字符是以十六进制形式表示的数值的 ASCII 字符。例如,GBase 8s ODBC Driver 将二进制 00000001 转换为 "01",将二进制 11111111 转换为 "FF"。

GBase 8s ODBC Driver将单独的字节转换为十六进制数字对,并以空字节终止该字符串。由于此惯例,如果 cbValueMax 是偶数,并小于被转换的数据的长度,则不使用 rgbValue 缓冲区的最后一个字节。(转换的数据需要偶数字节,邻近最后一个字节的是空字节,且不可使用最后的字节。)

SQL 至 C:布尔

布尔 GBase 8s ODBC Driver SQL 数据类型为 SQL_BIT。

下表展示可将布尔 SQL 数据转换为哪些 GBase 8s ODBC Driver C 数据类型。当 GBase 8s ODBC Driver 将布尔 SQL 数据转换为字符 C 数据时,可能的值为 0 和 1。

可将布尔 SQL 数据转换成的 GBase 8s ODBC Driver C 数据类型

fCType 测试 rgbValue pcbValue SQLSTATE
SQL_C_BINARY cbValueMax ≤ 1 数据 1 不适用
cbValueMax < 1 未受影响 未受影响 22003
SQL_C_BIT 对于此转换, GBase 8s ODBC Driver 忽略 cbValueMax 的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。 数据 1(这是对应的 C 数据类型的大小。) 不适用
SQL_C_CHAR cbValueMax > 1 数据 1 不适用
cbValueMax ≤ 1 未受影响 未受影响 22003
SQL 至 C:字符

字符 GBase 8s ODBC Driver SQL 数据类型为 SQL_CHAR、SQL_LONGVARCHAR 和 SQL_VARCHAR。

下表展示可将字符 SQL 数据转换为哪些 GBase 8s ODBC Driver C 数据类型。当 GBase 8s ODBC Driver 将字符 SQL 数据转换为数值、日期或时间戳 C 数据时,它忽略开头和结尾的空格。

可将字符 SQL 数据转换成的 GBase 8s ODBC Driver C 数据类型。

fCType 测试 rgbValue pcbValue SQLSTATE
SQL_C_BINARY 数据的长度 ≤ cbValueMax。 数据 数据的长度 不适用
数据的长度 > cbValueMax。 截断的数据 数据的长度 01004
SQL_C_BIT 数据为 0 或 1。 数据 1 不适用
数据大于 0,小于 2,且不等于 1。 截断的数据 1 01004
数据小于 0 或大于或等于 2。 未受影响 未受影响 22003
数据不是数值-文字。 未受影响 未受影响(对应的 C 数据类型的大小为 1。) 22005
SQL_C_CHAR 数据的长度 < cbValueMax。 数据 数据的长度 不适用
数据的长度 ≥ cbValueMax。 截断的数据 数据的长度 01004
SQL_C_DATE 数据值是有效的日期值。 数据 6 不适用
数据值是有效的时间戳值;时间部分为零。 数据 6 不适用
数据值是有效的时间戳值;时间部分非零。 (GBase 8s ODBC Driver忽略时间戳值的日期部分。) 截断的数据 6 01004
数据值不是有效的日期值或时间戳值。 (对于所有这些转换,GBase 8s ODBC Driver 忽略 cbValueMax的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver使用 rgbValue 的大小。) 未受影响 未受影响(对应的 C 数据类型的大小是 6。) 22008
SQL_C_DOUBLE
SQL_C_FLOAT
数据值是有效的日期值。 数据 6 不适用
数据在正在将数值转换为其的数据类型的范围之内。 数据 C 数据类型的大小 不适用
数据在正在将数值转换为其的数据类型的范围之外。 未受影响 未受影响 22003
数据不是数值-文字。(对于所有这些转换,GBase 8s ODBC Driver 忽略 cbValueMax的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver使用 rgbValue 的大小。) 未受影响 未受影响 22005
SQL_C_LONG
SQL_C_SHORT
SQL_C_SLONG
SQL_C_SSHORT
SQL_C_STINYINT
SQL_C_TINYINT
SQL_C_ULONG
SQL_C_USHORT
SQL_C_UTINYINT
无截断的数据转换。 数据 C 数据类型的大小 不适用
截断小数位的转换的数据。 截断的数据 C 数据类型的大小 01004
数据的转换会导致整个数字丢失(不同于小数位)。 未受影响 未受影响 22003
数据不是数值-文字。(对于所有这些转换,GBase 8s ODBC Driver 忽略 cbValueMax的值。对于 C 数据类型的大小,GBase 8s ODBC Driver使用 rgbValue 的大小。) 未受影响 未受影响 22005
SQL_C_TIMESTAMP 数据值是有效的时间戳值;不截断小数秒部分。 数据 16 不适用
数据值是有效的时间戳值;截断小数秒部分。 截断的数据 16 不适用
数据值是有效的日期值。 数据(GBase 8s ODBC Driver将时间戳结构的时间域设置为零。) 16 不适用
数据值是有效的时间值。 数据 (GBase 8s ODBC Driver将时间戳结构的日期域设置为当前日期。) 16 不适用
数据值不是有效的日期值、时间值或时间戳值(对于所有这些转换,GBase 8s ODBC Driver 忽略 cbValueMax的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver使用 rgbValue 的大小。) 未受影响 未受影响(对应的 C 数据类型的大小为 16。) 22008
SQL 至 C:日期

日期 GBase 8s ODBC Driver SQL 数据类型为 SQL_DATE。

下表展示可将日期 SQL 数据转换为哪些 GBase 8s ODBC Driver C 数据类型。当 GBase 8s ODBC Driver 将日期 SQL 数据转换为字符 C 数据时,结果字符串的格式为 yyyy-mm-dd。

可将日期 SQL 数据转换成的 GBase 8s ODBC Driver C 数据类型。

fCType 测试 rgbValue pcbValue SQLSTATE
SQL_C_BINARY 数据的长度 ≤ cbValueMax 数据 数据的长度 不适用
数据的长度 > cbValueMax 未受影响 未受影响 22003
SQL_C_CHAR cbValueMax ≥ 11 数据 10 不适用
cbValueMax < 11 未受影响 未受影响 22003
SQL_C_DATE 对于此转换,GBase 8s ODBC Driver 忽略 cbValueMax 的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。 数据 6(这是对应的 C 数据类型的大小。) 不适用
SQL_C_TIMESTAMP 对于此转换,GBase 8s ODBC Driver 忽略 cbValueMax 的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。 数据(GBase 8s ODBC Driver 将时间戳结构的时间域设置为零。) 16(这是对应的 C 数据类型的大小。) 不适用
SQL 至 C:数值

数值 GBase 8s ODBC Driver SQL 数据类型是 SQL_DECIMAL、SQL_DOUBLE、SQL_INTEGER、SQL_REAL 和 SQL_SMALLINT

下表展示可将数值 SQL 数据转换为哪些 GBase 8s ODBC Driver C 数据类型。

可将数值 SQL 数据转换成的 GBase 8s ODBC Driver C 数据类型。

fCType 测试 rgbValue pcbValue SQLSTATE
SQL_C_BINARY 数据的长度 ≤ cbValueMax。 数据 数据的长度 不适用
数据的长度 > cbValueMax。 未受影响 未受影响 22003
SQL_C_BIT 数据为 0 或 1。 数据 1 不适用
数据大于 0,小于 2,且不等于 1。 截断的数据 1 01004
数据小于 0 或大于或等于 2。 未受影响 未受影响 22003
数据不是数值-文字。 未受影响 未受影响(对应的 C 数据类型的大小为 1。) 22005
SQL_C_CHAR 显示大小 < cbValueMax 数据 数据的长度 不适用
所有位数(相对于小数位)< cbValueMax。 截断的数据 数据的长度 01004
所有位数(相对于小数位)≥ cbValueMax。 未受影响 未受影响 22003
SQL_C_DOUBLE
SQL_C_FLOAT
数据在正在将数值转换为其的数据类型的范围之内。 数据 C 数据类型的大小 不适用
数据在正在将数值转换至的数据类型的范围之外。(对于此转换,GBase 8s ODBC Driver 忽略 cbValueMax 的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。) 未受影响 未受影响 22003
SQL_C_LONG
SQL_C_SHORT
SQL_C_SLONG
SQL_C_SSHORT
SQL_C_STINYINT
SQL_C_TINYINT
SQL_C_ULONG
SQL_C_USHORT
SQL_C_UTINYINT
无截断的数据转换。 数据 C 数据类型的大小 不适用
截断小数位的转换的数据。 截断的数据 C 数据类型的大小 01004
数据的转换会导致所有位的丢失(相对于小数位)。(对于此转换,GBase 8s ODBC Driver 忽略 cbValueMax 的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。) 未受影响 未受影响 22003
SQL 至 C:时间戳

时间戳 GBase 8s ODBC Driver SQL 数据类型为 SQL_TIMESTAMP。

下表展示可将时间戳 SQL 数据转换为哪些 GBase 8s ODBC Driver C 数据类型。

可将时间戳 SQL 数据转换成的 GBase 8s ODBC Driver C 数据类型。

fCType 测试 rgbValue pcbValue SQLSTATE
SQL_C_BINARY 数据的长度 ≤ cbValueMax 数据 数据的长度 不适用
数据的长度 > cbValueMax 未受影响 未受影响 22003
SQL_C_CHAR cbValueMax ≥ 显示大小。 数据 数据的长度 不适用
20 ≤ cbValueMax ≤ 显示大小。 截断的数据(GBase 8s ODBC Driver 截断时间戳的小数秒部分。) 数据的长度 01004
cbValueMax < 20。 未受影响 未受影响 22003
SQL_C_DATE 时间戳的时间部分为零。 数据 6 不适用
时间戳的时间部分非零。(对于此转换,GBase 8s ODBC Driver 忽略 cbValueMax 的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。) 截断的数据(GBase 8s ODBC Driver 截断时间戳的时间部分。) 6(对应的 C 数据类型的大小为 6。) 01004
SQL_C_TIMESTAMP 不截断时间戳的小数秒部分。 数据 16 不适用
截断时间戳的小数秒部分。(对于此转换,GBase 8s ODBC Driver 忽略 cbValueMax 的值。对于该 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。) 截断的数据(GBase 8s ODBC Driver截断时间戳的小数秒部分。) 16(对应的 C 数据类型的大小为 16。) 01004

当 GBase 8s ODBC Driver 将时间戳 SQL 数据转换为字符 C 数据时,生成的字符串采用 yyyy-mm-dd hh:mm:ss[.f...] 的格式,在此,小数秒最多可使用九位。除了小数点和小数秒以外,不论时间戳 SQL 数据类型的精度,都必须使用整个格式,。

SQL 至 C 数据转换示例

这些示例展示 GBase 8s ODBC Driver 如何将 SQL 数据转换为 C 数据。

下表说明 GBase 8s ODBC Driver 如何将 SQL 数据转换为 C 数据。"\0" 表示空终止字节(当该 C 数据类型为 SQLC_WCHAR 时,"\0" 表示一个宽的空终止字符)。GBase 8s ODBC Driver 始终以空字符来终止 SQL_C_CHARSQL_C_WCHAR 数据。对于 SQL_DATE 与 SQL_C_TIMESTAMP 的组合,GBase 8s ODBC Driver 将 _rgbValue 列中的数值存储在 TIMESTAMP_STRUCT 结构的字段中 。

展示 GBase 8s ODBC Driver 如何将 SQL 数据转换为 C 数据的六列表。

SQL 数据类型SQL 数据值C 数据类型cbValueMaxrgbValueSQLSTATE
SQL_CHARtigersSQL_C_CHAR7tigers\0不适用
SQL_CHARtigersSQL_C_CHAR6tiger\001004
SQL_CHARtigersSQL_C_WCHAR14tigers\0不适用
SQL_CHARtigersSQL_C_WCHAR12tiger\001004
SQL_DECIMAL1234.56SQL_C_CHAR81234.56\0不适用
SQL_DECIMAL1234.56SQL_C_CHAR51234\001004
SQL_DECIMAL1234.56SQL_C_CHAR422003
SQL_DECIMAL1234.56SQL_C_WCHAR161234.56\0不适用
SQL_DECIMAL1234.56SQL_C_WCHAR101234\001004
SQL_DECIMAL1234.56SQL_C_WCHAR8220023
SQL_DECIMAL1234.56SQL_C_FLOAT忽略的1234.56不适用
SQL_DECIMAL1234.56SQL_C_SSHORT忽略的123401004
SQL_DECIMAL1234.56SQL_C_STINYINT忽略的22003
SQL_DOUBLE1.2345678SQL_C_DOUBLE忽略的1.234567不适用
SQL_DOUBLE1.2345678SQL_C_FLOAT忽略的1.234567不适用
SQL_DOUBLE1.2345678SQL_C_STINYINT忽略的1不适用
SQL_DATE1992-12-31SQL_C_CHAR111992-12-31\0不适用
SQL_DATE1992-12-31SQL_C_CHAR1022003
SQL_DATE1992-12-31SQL_C_WCHAR221992-12-31\0不适用
SQL_DATE1992-12-31SQL_C_WCHAR2022003
SQL_DATE1992-12-31SQL_C_TIMESTAMP忽略的1992,12,31, 0,0,0,0不适用
SQL_TIMESTAMP1992-12-31 23:45:55.12SQL_C_CHAR231992-12-31 23:45:55.12\0不适用
SQL_TIMESTAMP1992-12-31 23:45:55.12SQL_C_CHAR221992-12-31 23:45:55.1\001004
SQL_TIMESTAMP1992-12-31 23:45:55.12SQL_C_CHAR1822003
SQL_TIMESTAMP1992-12-31 23:45:55.12SQL_C_WCHAR461992-12-31 23:45:55.12\0不适用
SQL_TIMESTAMP1992-12-31 23:45:55.12SQL_C_WCHAR441992-12-31 23:45:55.1\001004
SQL_TIMESTAMP1992-12-31 23:45:55.12SQL_C_WCHAR3622003
重要

宽字符(wchar_t)的大小与平台有关。前面的示例适用于 Windows™,在此,宽字符的大小为 2 字节。在大多数 UNIX™ 平台上,宽字符为 4 字节。在低于 AIX5L 版本的 GBase AIX 上,它是 2 字节。

由 C 转换为 SQL

当调用 SQLExecute 或 SQLExecDirect 时,GBase 8s ODBC Driver 从应用程序中的存储位置检索使用 SQLBindParameter 绑定的参数的数据。

对于处于执行的数据参数,请调用 SQLPutData 来发送参数数据。如有必要,GBase 8s ODBC Driver 将数据由 SQLBindParameter 中 ValueType 参数指定的数据类型转换为 SQLBindParameter 中 fSqlType 参数指定的数据类型。最终,GBase 8s ODBC Driver 将数据发送至数据源。

如果在 SQLBindParameter 中指定的 rgbValuepcbValue 参数都是空指针,则该函数返回 SQLSTATE S1009(无效的参数值)。要指定空 SQL 数据值,请将 SQLBindParameter 的 pcbValue参数指向的值,或将 cbValue 参数的值设置为 SQLNULL_DATA。要指定 _rgbValue 中的值为空终止字符串,请将这些值设置为 SQL_NTS。

在表中使用下列术语:

数据的长度

无论数据在发送到应用程序之前是否被截断,可用于发送至数据源的 SQL 数据的字节数。对于字符串数据,这不包括空终止字节。

列长度和显示大小

定义了精度、小数位数、长度和显示大小 中的每个 SQL 数据。

位数

表示数值的字符数,包括负号、小数点和指数(如果需要的话)。

斜体词语

表示 GBase 8s ODBC Driver SQL 语法的元素。

C 至 SQL:二进制

二进制 GBase 8s ODBC Driver C 数据类型为 SQL_C_BINARY

下表展示可将二进制 C 数据转换为哪些 GBase 8s ODBC Driver SQL 数据类型。在“测试”列中,SQL 数据长度是在数据源上存储该数据需要的字节数。此长度可能不同于列长度,如同 精度、小数位数、长度和显示大小 中定义的那样。

可将 C 数据转换为哪些 GBase 8s ODBC Driver SQL 数据类型。

fSqlType 测试 SQLSTATE
SQL_BIGINT 数据的长度 = SQL 数据长度。 不适用
数据的长度 ≠ SQL 数据长度。 22003
SQL_BIT 数据的长度 = SQL 数据长度。 不适用
数据的长度 ≠ SQL 数据长度。 22003
SQL_CHAR
SQL_LONGVARCHAR
SQL_VARCHAR
数据的长度 ≠ 列长度。 不适用
数据的长度 > 列长度。 01004
SQL_DATE
SQL_TIMESTAMP
数据的长度 = SQL 数据长度。 不适用
数据的长度 ≠ SQL 数据长度。 22003
SQL_DECIMAL
SQL_DOUBLE
SQL_INTEGER
SQL_REAL
SQL_SMALLINT
数据的长度 = SQL 数据长度。 不适用
数据的长度 ≠ SQL 数据长度。 22003
SQL_LONGVARBINARY 数据的长度 ≠ 列长度。 不适用
数据的长度 > 列长度。 01004
C 至 SQL:位

位 GBase 8s ODBC Driver C 数据类型为 SQL_C_BIT

下表展示可将位 C 数据转换为哪些 GBase 8s ODBC Driver SQL 数据类型。

fSqlType测试SQLSTATE
SQL_BIGINT
SQL_DECIMAL
SQL_DOUBLE
SQL_INTEGER
SQL_REAL
SQL_SMALLINT
不适用
SQL_BIT不适用
SQL_CHAR
SQL_LONGVARCHAR
SQL_VARCHAR
不适用

GBase 8s ODBC Driver 会忽略 SQLBindParameter 的 pcbValue 参数指向的值,以及从布尔 C 数据类型转换数据时 SQLPutData 的 cbValue 参数的值。GBase 8s ODBC Driver 使用 rgbValue 的大小来表示布尔 C 数据类型的大小。

C 至 SQL:字符

字符 GBase 8s ODBC Driver C 数据类型为 SQL_C_CHAR

下表展示可将 C 字符数据转换为哪些 GBase 8s ODBC Driver SQL 数据类型。

可将 C 字符数据转换成的 GBase 8s ODBC Driver SQL 数据类型。

fSqlType 测试 SQLSTATE
SQL_BIGINT 无截断转换的数据。 不适用
截断小数为的转换的数据。 01004
数据转换会导致所有位的丢失(与小数位相反)。 22003
数据值不是数值-文字。 22005
SQL_BIT 数据为 0 或 1。 不适用
数据大于 0,小于 2,且不等于 1。 01004
数据小于 0,或大于或等于 2。 22003
数据不是数值-文字。 22005
SQL_CHAR
SQL_LONGVARCHAR
SQL_VARCHAR
数据的长度 ≤ 列长度。 不适用
数据的长度 > 列长度。 01004
SQL_DATE 数据值是有效的 GBase 8s ODBC 驱动程序日期-文字。 不适用
数据值是有效的 GBase 8s ODBC 驱动程序时间戳-文字;时间部分为零。 不适用
数据值是有效的 GBase 8s ODBC 驱动程序时间戳-文字;时间部分非零。GBase 8s ODBC 驱动程序截断时间戳的时间部分。 01004
数据值不是有效的 GBase 8s ODBC 驱动程序日期-文字 或 GBase 8s ODBC 驱动程序时间戳-文字。 22008
SQL_DECIMAL
SQL_INTEGER
SQL_SMALLINT
未经截断转换的数据。 不适用
截断小数位转换的数据。 01004
数据的转换会导致所有位的丢失(与小数为相反)。 22003
数据值不是数值-文字。 22005
SQL_DOUBLE
SQL_REAL
数据在正在将数值转换为其的数据类型的范围之内。 不适用
数据在正在将数值转换为其的数据类型的范围之外。 22003
数据值不是数值-文字。 22005
SQL_LONGVARBINARY (数据的长度) / 2 ≤ 列长度。 不适用
(数据的长度) / 2 > 列长度。 01004
数据值不是十六进制值。 22005
SQL_TIMESTAMP 数据值是有效的 GBase 8s ODBC 驱动程序时间戳-文字;不截断小数秒部分。 不适用
数据值是有效的 GBase 8s ODBC 驱动程序时间戳-文字;截断小数秒部分。 01004
数据值是有效的 GBase 8s ODBC 驱动程序日期-文字。GBase 8s ODBC 驱动程序将时间戳的时间部分设置为零。 不适用
数据值是有效的 GBase 8s ODBC 驱动程序时间-文字。GBase 8s ODBC 驱动程序将时间戳的日期部分设置为当前日期。 不适用
数据值不是有效的 GBase 8s ODBC 驱动程序日期-文字、GBase 8s ODBC 驱动程序时间-文字 或 GBase 8s ODBC 驱动程序时间戳-文字。 22008

当 GBase 8s ODBC Driver 将字符 C 时间转换为数值、日期或时间戳 SQL 数据时,它忽略开头和结尾的空格。当 GBase 8s ODBC Driver 将字符 C 数据转换为二进制 SQL 数据时,它将每一两字节字符数据转换为一字节二进制数据。每一两字节字符数据表示一个十六进制形式的数值。例如,GBase 8s ODBC Driver 将 "01" 转换为二进制 00000001,将 "FF" 转换为二进制 11111111。

GBase 8s ODBC Driver 始终将十六进制数字对转换为单独的字节,并忽略空终止字节。由于此转换,如果字符串的长度是奇数,则不转换该字符串的最后一个字节(不包括空终止字节,如果有的话)。

C 至 SQL:日期

日期 GBase 8s ODBC Driver C 数据类型为 SQL_C_DATE

下表展示可将日期 C 数据转换为哪些 GBase 8s ODBC Driver SQL 数据类型。

可将日期 C 数据转换成的 GBase 8s ODBC Driver SQL 数据类型。

fSqlType 测试 SQLSTATE
SQL_CHAR
SQL_LONGVARCHAR
SQL_VARCHAR
列长度 ≥ 10。 不适用
列长度 < 10。 22003
数据值不是有效的日期。 22008
SQL_DATE 数据值是有效的日期。 不适用
数据值不是有效的日期。 22008
SQL_TIMESTAMP 数据值是有效的日期。GBase 8s ODBC 驱动程序将时间戳的时间部分设置为零。 不适用
数据值不是有效的日期。 22008

当 GBase 8s ODBC Driver 将日期 C 数据转换为字符 SQL 数据时,生成的字符串采用 yyyy-mm-dd 的格式。

当它将数据由日期 C 数据类型转换时,GBase 8s ODBC Driver 忽略 SQLBindParameter 的 pcbValue 参数指向的值,以及 SQLPutData 的 cbValue 参数的值。对于该日期 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。

C 至 SQL:数值

总共有十种 GBase 8s ODBC Driver C 数据类型。

数值 GBase 8s ODBC Driver C 数据类型是:

  • SQL_C_DOUBLE
  • SQL_C_FLOAT
  • SQL_C_LONG
  • SQL_C_SHORT
  • SQL_C_SLONG
  • SQL_C_STINYINT
  • SQL_C_TINYINT
  • SQL_C_ULONG
  • SQL_C_USHORT
  • SQL_C_UTINYINT

下表展示可将数值 C 数据转换为哪些 GBase 8s ODBC Driver SQL 数据类型。

可将数值 C 数据转换成的 GBase 8s ODBC Driver SQL 数据类型。

fSqlType 测试 SQLSTATE
SQL_BIGINT 未截断的转换的数据。 不适用
截断小数位的转换的数据。 01004
数据的转换会导致所有位的丢失(与小数位相反)。 22003
SQL_BIT 数据为 0 或 1。 不适用
数据大于 0,小于 2,且不等于 1。 01004
数据小于 0 或大于或等于 2。 22003
SQL_CHAR
SQL_LONGVARCHAR
SQL_VARCHAR
位数 ≤ 列长度。 不适用
所有位数(与小数位相反)≤ 列长度。 01004
所有位数(与小数位相反)> 列长度。 22003
SQL_DECIMAL
SQL_INTEGER
SQL_SMALLINT
未截断的转换的数据 不适用
截断小数位的转换的数据。 01004
数据的转换会导致所有位的丢失(与小数位相反)。 22003
SQL_DOUBLE
SQL_REAL
数据在正在将数值转换为其的数据类型的范围之内。 不适用
数据在正在将数值转换为其的数据类型的范围之外。 22003

当它从数值 C 数据类型转换数据时,GBase 8s ODBC Driver 忽略 SQLBindParameter 的 pcbValue 参数指向的值,以及 SQLPutData 的 cbValue 参数的值。对于数值 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。

C 至 SQL:时间戳

时间戳 GBase 8s ODBC Driver C 数据类型为 SQL_C_TIMESTAMP

下表展示可将时间戳 C 数据转换为哪些 GBase 8s ODBC Driver SQL 数据类型。

可将时间戳 C 数据转换成的 GBase 8s ODBC Driver SQL 数据类型。

fSqlType 测试 SQLSTATE
SQL_CHAR
SQL_LONGVARCHAR
SQL_VARCHAR
列长度 ≥ 显示大小。 不适用
19 ≤ 列长度 < 显示大小。 GBase 8s ODBC Driver 截断时间戳的小数秒。 01004
列长度 < 19。 22003
数据值不是有效的日期。 22008
SQL_DATE 时刻域为零。 不适用
时刻域非零。GBase 8s ODBC Driver 截断时间戳结构的时刻域。 01004
数据值不包含有效的日期。 22008
SQL_TIMESTAMP 不截断小数秒域。 不适用
截断小数秒域。GBase 8s ODBC Driver 截断时间戳结构的小数秒域。 01004
数据值不是有效的时间戳。 22008

当 GBase 8s ODBC Driver 将时间戳 C 数据转换为字符 SQL 数据时,生成的字符串采用 yyyy-mm-dd hh:mm:ss[.f...] 的格式。

当它由时间戳 C 数据类型转换数据时,GBase 8s ODBC Driver 忽略 SQLBindParameter 的 pcbValue 参数指向的值,以及 SQLPutData 的 cbValue 参数的值。对于该时间戳 C 数据类型的大小,GBase 8s ODBC Driver 使用 rgbValue 的大小。

C 至 SQL 数据转换示例

这些示例展示 GBase 8s ODBC Driver 如何将 C 数据转换为 SQL 数据。

下表说明 GBase 8s ODBC Driver 如何将 C 数据转换为 SQL 数据。"\0" 表示一个空终止字节。仅当该数据的长度为 SQL_NTS 时,才需要空终止字节。对于 SQL_C_DATE,在“C 数据值”列中的数值是存储在 DATE_STRUCT 结构的字段中的数值。对于 SQL_C_TIMESTAMP,在“C 数据值”列中的数值是存储在 TIMESTAMP_STRUCT 结构的字段中的数值。

C 数据类型C 数据值SQL 数据类型列长度SQL 数据值SQLSTATE
SQL_C_CHARtigers\0SQL_CHAR6tigers不适用
SQL_C_CHARtigers\0SQL_CHAR5tiger01004
SQL_C_CHAR1234.56\0SQL_DECIMAL8 (除了数值的字节之外,还需要一个符号字节和另一个小数点字节。)1234.56不适用
SQL_C_CHAR1234.56\0SQL_DECIMAL7 (除了数值的字节之外,还需要一个符号字节和另一个小数点字节。)1234.501004
SQL_C_CHAR1234.56\0SQL_DECIMAL422003
SQL_C_FLOAT1234.56SQL_FLOAT不适用1234.56不适用
SQL_C_FLOAT1234.56SQL_INTEGER不适用123401004
SQL_C_FLOAT1234.56SQL_TINYINT不适用22003
SQL_C_DATE1992,12,31SQL_CHAR101992-12-31不适用
SQL_C_DATE1992,12,31SQL_CHAR922003
SQL_C_DATE1992,12,31SQL_TIMESTAMP不适用1992-12-31 00:00:00.0不适用
SQL_C_TIMESTAMP1992,12,31, 23,45,55, 120000000SQL_CHAR221992-12-31 23:45:55.12不适用
SQL_C_TIMESTAMP1992,12,31, 23,45,55, 120000000SQL_CHAR211992-12-31 23:45:55.101004
SQL_C_TIMESTAMP1992,12,31, 23,45,55, 120000000SQL_CHAR1822003